# coding=utf8

'''
Created on 2011. 9. 30.
@summary: 검색광고 노출 관련 테스트 자동화 (through Webdriver)
@author: josephy74
'''


import unittest
import time
import xmlrunner
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys

class SearchAdPowerLink(unittest.TestCase):
    """
    통검의 파워링크 광고에 대한 테스트 클래스 
       
    """  

    def setUp(self):
        self.verificationErrors = []
        self.driver = webdriver.Firefox()

    def tearDown(self):
        #self.driver.close()
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)


    def testT001AdCollectionDisplay(self):
        """
        광고 영역 상단 추천 비즈니스키워드 섹션 노출 확
        
        Given 통검 진입
        When '대출' 키워드 검색
        Then 추천 비즈니스키워드섹션노출
        """
        
        #Given
        driver = self.driver
        #driver.get("http://search.naver.com/search.naver?where=nexearch&query=&x=34&y=18&sm=top_hty&fbm=0&ie=utf8")
        driver.get("http://www.naver.com")
        self.assertIn(u"네이버",driver.title)
        
        
        #When
        elem = driver.find_element_by_id("query")
        elem.send_keys(u"대출") 
        elem.send_keys(Keys.RETURN)  
        
        time.sleep(1)
        
        #Then
        try:
            self.assertEqual("",driver.find_element_by_xpath(u"//img[@alt='추천비즈니스키워드']").text)
        except AssertionError as e: self.verificationErrors.append(str(e))

    def testT002AdCount(self):
        """
        광고 10개 노출
        
        GIVEN 네이버 진입
        WHEN 키워드 검색 '대출'
        THEN 광고 10개 노출
        """
        
        #Given
        driver = self.driver
        driver.get("http://www.naver.com")
        self.assertIn(u"네이버",driver.title)
              
        #When
        elemSearchTxtBox = driver.find_element_by_id("query")
        elemSearchTxtBox.send_keys(u"대출") 
        elemSearchTxtBox.send_keys(Keys.RETURN)  
        
        time.sleep(1)

        #Then
        elemAdList = driver.find_elements_by_xpath("//*[@class='type01 pw_type_4']/li")
        try:
            self.assertEqual(len(elemAdList),10)
        except AssertionError as e: self.verificationErrors.append(str(e))

    def testT003AdSiteRedirection(self):
        """
        각 광고 타이틀을 클릭하여 광고 사이트로 이동 
        
        GIVEN 네이버 진입
        WHEN 키워드 검색 '대출'
        THEN 노출된 광고 10개에 대한 타이틀을 클릭하여 광고사이트로 이동 (1번째               
        """
        
        #Given
        driver = self.driver
        driver.get("http://www.naver.com")
        self.assertIn(u"네이버",driver.title)
              
        #When
        elemSearchTxtBox = driver.find_element_by_id("query")
        elemSearchTxtBox.send_keys(u"대출") 
        elemSearchTxtBox.send_keys(Keys.RETURN)  
        
        time.sleep(1)

        #Then
        elemAdTitle = driver.find_elements_by_xpath("//ul[@class='type01 pw_type_4']/li/dl/dt/a")
        
        for x in range(0,2):  #상위 2개의 광고만 클릭함. 
            elemAdTitle[x].click()
            time.sleep(1)
        
        
        #{To-do}  전체 10위까지의 광고 클릭 시도하엿으나.. 중간에서 에러   
        #for x in elemAdTitle:
        #    x.click()
        #    time.sleep(1)
    
    def testT004AdRule01(self):
        """
        노출 연관 - 키워드 광고 공통 정책 (1) 
                - 동일한 사이트는 동일한 광고 영역에서 중복될 수 없다.
        
        GIVEN 네이버 진입
        WHEN 키워드 검색 '대출'
        THEN 동일사이트 존재 체크                
        """
        #Given
        driver = self.driver
        driver.get("http://www.naver.com")
        self.assertIn(u"네이버",driver.title)
              
        #When
        elemSearchTxtBox = driver.find_element_by_id("query")
        elemSearchTxtBox.send_keys(u"대출") 
        elemSearchTxtBox.send_keys(Keys.RETURN)  
        
        time.sleep(1)

        #Then
        #//ul[@class='type01 pw_type_4']/li/dl/dd[@class="txt_inline"]/a
        elemAdUrl = driver.find_elements_by_xpath("//ul[@class='type01 pw_type_4']/li/dl/dd[@class='txt_inline']/a")
        
        #  a 태그에서 디스플레이되는 값이 사이트url만 가지고 와야함 
        #  해당 url이 중복이 있는지 확인함. 
               
        #print elemAdUrl
        
         
        

class SearchAdBizSite(unittest.TestCase):
    """
    통검의 비즈사이 광고에 대한 테스트 클래스 

    """     

    def setUp(self):
        self.verificationErrors = []
        self.driver = webdriver.Firefox()

    def tearDown(self):
        #self.driver.close()
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
    
    
    def testT001AdCount(self):
        """
        광고 5개 노출
        
        GIVEN 네이버 진입
        WHEN 키워드 검색 '대출'
        THEN 광고 5개 노출
        """
        
        #Given
        driver = self.driver
        driver.get("http://www.naver.com")
        self.assertIn(u"네이버",driver.title)
              
        #When
        elemSearchTxtBox = driver.find_element_by_id("query")
        elemSearchTxtBox.send_keys(u"대출") 
        elemSearchTxtBox.send_keys(Keys.RETURN)  
        
        time.sleep(1)

        #Then
        elemAdList = driver.find_elements_by_xpath("//ul[@class='type01 biz_type_3']/li/dl")
        try:
            self.assertEqual(len(elemAdList),5)
        except AssertionError as e: self.verificationErrors.append(str(e))
        
        
class SearchAdSE(unittest.TestCase):
    """
    SE 검색 광고에 대한 테스트 클래스 

    """     

    def setUp(self):
        self.verificationErrors = []
        self.driver = webdriver.Firefox()

    def tearDown(self):
        #self.driver.close()
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)    
    
    def testT001AdCount(self):
        """
        광고 5개 노출
        
        GIVEN SE검색 진입 
        WHEN 키워드 검색 '대출'
        THEN 광고 5개 노출
        """
        
        #Given
        driver = self.driver
        driver.get("http://se.naver.com")
        self.assertIn(u"네이버",driver.title)
              
        #When
        elemSearchTxtBox = driver.find_element_by_id("nx_query")
        elemSearchTxtBox.clear()
        elemSearchTxtBox.send_keys(u"대출") 
        elemSearchTxtBox.send_keys(Keys.RETURN)
        #driver.find_element_by_css_selector("button[type=\"submit\"]").click()

        time.sleep(1)

        #Then
        elemAdList = driver.find_elements_by_xpath("//ul[@class='type01 pw_type_4']/li/dl")
        try:
            self.assertEqual(len(elemAdList),5)
        except AssertionError as e: self.verificationErrors.append(str(e))        
        

class SearchAdTabsearch(unittest.TestCase):
    """
    검색 탭의 검색 광고에 대한 테스트 클래스 

    """     

    def setUp(self):
        self.verificationErrors = []
        self.driver = webdriver.Firefox()

    def tearDown(self):
        #self.driver.close()
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
    
    def testT001AdCout(self):
        """
        광고 3개 노출
        
        GIVEN 네이버 진입
        and   키워드 검색 '대출'
        WHEN  블로그,카페,지식 iN, 사이트 탭 접근 
        THEN  각 탭별 광고 3개 노출
        """
        
        #Given
        driver = self.driver
        driver.get("http://www.naver.com")
        self.assertIn(u"네이버",driver.title)
              
        elemSearchTxtBox = driver.find_element_by_id("query")
        elemSearchTxtBox.send_keys(u"대출") 
        elemSearchTxtBox.send_keys(Keys.RETURN)  
        
        time.sleep(1)    
        
        #When - 지식인 탭 
        driver.find_element_by_xpath("//li[@id='leftmenu_kin']/a").click()
        time.sleep(1)
        elemAdListKin = driver.find_elements_by_xpath("//ul[@class='type01 pw_type_4']/li/dl")

        #When - 카페 탭 
        driver.find_element_by_xpath("//li[@id='leftmenu_cafeblog']/a").click()
        time.sleep(1)
        elemAdListCafe = driver.find_elements_by_xpath("//ul[@class='type01 pw_type_4']/li/dl")

        #When - 블로그 탭 
        driver.find_element_by_xpath("//li[@id='leftmenu_blog']/a").click()
        time.sleep(1)
        elemAdListBlog = driver.find_elements_by_xpath("//ul[@class='type01 pw_type_4']/li/dl")

        #When - 사이트 탭 
        driver.find_element_by_xpath("//li[@id='leftmenu_blog']/a").click()
        time.sleep(1)
        elemAdListSite = driver.find_elements_by_xpath("//ul[@class='type01 pw_type_4']/li/dl")

        try:
            self.assertEqual(len(elemAdListKin),3)
            self.assertEqual(len(elemAdListCafe),3)
            self.assertEqual(len(elemAdListBlog),3)
            self.assertEqual(len(elemAdListSite),3)
        except AssertionError as e: self.verificationErrors.append(str(e))         
                          
        

if __name__ == "__main__":

    #hudson reporting을 위해 xmlrunner이용
    runner = xmlrunner.XMLTestRunner()
 
    suiteSearchAdPowerLink = unittest.TestLoader().loadTestsFromTestCase(SearchAdPowerLink)
    #unittest.TextTestRunner(verbosity=2).run(suiteSearchAdPowerLink)
    #runner.run(suiteSearchAdPowerLink)
    
    suiteSearchAdBizSite = unittest.TestLoader().loadTestsFromTestCase(SearchAdBizSite)
#    unittest.TextTestRunner(verbosity=2).run(suiteSearchAdBizSite)
#    runner.run(suiteSearchAdBizSite)
    
    suiteSearchAdSE = unittest.TestLoader().loadTestsFromTestCase(SearchAdSE)
#    unittest.TextTestRunner(verbosity=2).run(suiteSearchAdSE)   
#    runner.run(suiteSearchAdSE)
    
    suiteSearchAdTabsearch = unittest.TestLoader().loadTestsFromTestCase(SearchAdTabsearch)
#    unittest.TextTestRunner(verbosity=2).run(suiteSearchAdTabsearch) 
#    runner.run(suiteSearchAdTabsearch)
    
    #Testsuite에 모든 테스트스윗을 넣어서 수행 
    allTests = unittest.TestSuite([suiteSearchAdPowerLink,suiteSearchAdBizSite,suiteSearchAdSE,suiteSearchAdTabsearch])
    runner.run(allTests)
    
    #unittest.main()    
    
    
    
    
    